'''
 python-excel联合爬取案例
'''
# 导入第三方库
import requests
from bs4 import BeautifulSoup
import pandas as pd

# 定义一个公用函数使用requests库获取源代码，唯一的参数为url
def getHTML(url):
    try:
        r = requests.get(url)  # 模拟发送HTTP GET请求
        html = r.text        # 返回文本形式的HTML源代码
        return html          # 返回html代码
    except:
        print("error")  # 如果有异常打印错误

# 定义一个函数getListData，使用soup的select方法，给定选择器来爬取
def getListData(html):
    # 解析网页源代码
    soup = BeautifulSoup(html,'html.parser')
    # 基于选择器使用select方法解析APP名称和简介，返回列表对象
    target_NameIntroTag = soup.select('.table_info p')
    # 遍历列表对象的元素text属性，获得文本内容，并存入列表
    NameIntro = [item.text for item in target_NameIntroTag]
    # 基于选择器使用select方法解析APP版本更新日期，返回列表对象
    target_VersionTag = soup.select('.table_info .table_date')
    # 遍历列表对象的元素text属性，获得文本内容，并存入列表
    version = [item.text for item in target_VersionTag]
    # 数据整理，将app名和简介分开存储到列表里
    app_name,app_intro=[],[]
    # 整理app名称和简介
    for item in NameIntro:
        # 如果元素中包含简介两个字，就使用冒号分割字符串取具体简介内容存到app_intro列表中
        if "简介" in item:
            intro = str(item).split('：')[1]
            app_intro.append(intro)
        # 如果不包括简介两个字，就是app的名称，直接存入app_name列表中
        else:
            app_name.append(item)
    version_date=[]
    # 整理版本更新日期数据，去除爬取下来的空格和扫App Store官方二维码下载文本
    for item in version:
        item=str(item).replace('扫App Store官方二维码下载','').strip()
        # 把版本日期取出来单独存入version_date列表中
        version_date.append(item.split('：')[1])
    return app_name,app_intro,version_date

# 主函数，调用相关函数爬取到数据并写入Excel文件中
if __name__ == '__main__':
    # 给定App应用排行榜页面url地址
    url = 'https://aso.chinaz.com/appstore.html'
    # 调用getHTML函数获取html代码
    html = getHTML(url)
    # 调用getListData函数爬取排行榜第一页前20名的app名，app简介和版本更新日期
    app,intro,version=getListData(html)
    #构造排名列表数据
    rank=[ (i+1) for i in range(20)]
    # 调用pandas的DataFrame函数将数据写入excel表中
    data={
        '排名': rank,
        'APP名称':app,
        'APP简介':intro,
        '版本更新日期':version
    }
    df = pd.DataFrame(data)
    df.to_excel('appBoard20.xlsx',index=False)